package com.wei.czz.framework.common.controller;

import com.wei.czz.common.dto.common.GroupValue;
import com.wei.czz.common.dto.common.NameValue;
import com.wei.czz.common.tool.Result;
import com.wei.czz.framework.common.entity.RegionCodeEntity;
import com.wei.czz.framework.common.service.RegionCodeService;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 省市区街道四级国标码表
 *
 * @author wei
 * email 945158190@gmail.com
 * date 2023-11-27 17:07:47
 */
@RestController
@RequestMapping("/region-code")
@AllArgsConstructor
public class RegionCodeController {

    private static final Logger log = LoggerFactory.getLogger(RegionCodeController.class);

    private final RegionCodeService regionCodeService;

    /**
     * 获取所有省份接口
     * @return 省份列表
     */
    @GetMapping("/provinceList")
    public Result<List<GroupValue<NameValue<Integer>>>> getProvinceList() {
        log.info("开始获取所有省份业务");

        List<GroupValue<NameValue<Integer>>> provinceList = regionCodeService.getProvinceList();

        log.info("获取所有省份业务结束");
        return Result.success(provinceList);
    }

    /**
     * 获取所有城市接口
     * @return 城市列表
     */
    @GetMapping("/cityList")
    public Result<List<GroupValue<NameValue<Integer>>>> getCityList() {
        log.info("开始获取所有城市业务");

        List<GroupValue<NameValue<Integer>>> cityList = regionCodeService.getCityList();

        log.info("获取所有城市业务结束");
        return Result.success(cityList);
    }

    /**
     * 获取所有区县接口
     * @return 区县列表
     */
    @GetMapping("/districtList")
    public Result<List<GroupValue<NameValue<Integer>>>> getDistrictList() {
        log.info("开始获取所有区县业务");

        List<GroupValue<NameValue<Integer>>> districtList = regionCodeService.getDistrictList();

        log.info("获取所有区县业务结束");
        return Result.success(districtList);
    }

    /**
     * 获取所有街道接口
     * @return 街道列表
     */
    @GetMapping("/streetList")
    public Result<List<GroupValue<NameValue<Integer>>>> getStreetList() {
        log.info("开始获取所有街道业务");

        List<GroupValue<NameValue<Integer>>> streetList = regionCodeService.getStreetList();

        log.info("获取所有街道业务结束");
        return Result.success(streetList);
    }


    /**
     * 获取下一级列表接口
     * @param code 父级code
     */
    @GetMapping("/childrenList")
    public Result<List<GroupValue<NameValue<Integer>>>> getChildrenList(@RequestParam("code") Integer code) {
        log.info("开始获取下一级列表业务。code={}", code);

        List<GroupValue<NameValue<Integer>>> list = regionCodeService.getChildrenList(code);

        log.info("获取下一级列表业务结束");
        return Result.success(list);
    }

    /**
     * 批量获取下一级列表接口
     * @param codeList 父级code列表
     */
    @PostMapping("/batchGet/childrenList")
    public Result<Map<Integer, List<GroupValue<NameValue<Integer>>>>> batchGetChildrenList(
            @RequestBody List<Integer> codeList) {
        log.info("开始获取下一级列表业务。codeList={}", codeList);

        Map<Integer, List<GroupValue<NameValue<Integer>>>> map = regionCodeService.batchGetChildrenList(codeList);

        log.info("获取下一级列表业务结束");
        return Result.success(map);
    }

    /**
     * 获取四级国标地区列表接口
     * @param level 级别
     * @return 国标地区列表
     */
    @GetMapping("/get/level")
    public Result<List<RegionCodeEntity>> getLevelRegionList(@RequestParam("level") Integer level) {
        log.info("开始获取四级国标地区列表业务。level={}", level);

        List<RegionCodeEntity> regionCodeList = regionCodeService.getLevelRegionList(level);

        log.info("获取四级国标地区列表业务结束");
        return Result.success(regionCodeList);
    }

    /**
     * 获取名称接口
     * @param code 国标码
     */
    @GetMapping("/name")
    public Result<String> getName(@RequestParam("code") Integer code) {
        log.info("获取名称业务。code={}", code);

        String name = regionCodeService.getName(code);

        log.info("名称业务结束");
        return Result.success(name);
    }

    /**
     * 批量获取名称接口
     * @param codeList 国标码列表
     */
    @PostMapping("/batchGet/name")
    public Result<Map<Integer, String>> batchGetName(@RequestBody List<Integer> codeList) {
        log.info("开始批量获取名称业务。codeList={}", codeList);

        Map<Integer, String> map = regionCodeService.batchGetName(codeList);

        log.info("批量获取名称业务结束");
        return Result.success(map);
    }

}
